package com.company.ljh.medium;

import com.company.ljh.utils.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @description:
 * 1161. 最大层内元素和
 * 提示
 * 中等
 * 110
 * 相关企业
 * 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层，而根节点的子节点位于第 2 层，依此类推。
 *
 * 请返回层内元素之和 最大 的那几层（可能只有一层）的层号，并返回其中 最小 的那个。
 * @projectName:leet_code
 * @see:com.company.ljh.medium
 * @author:ljh
 * @createTime:2023/7/5 10:41
 * @version:1.0
 */
public class 最大层内元素和 {
    public int maxLevelSum(TreeNode root) {
        //0保存最大值1保存最大值层数，2保存最小值，3保存最小值层数
        long []numArray = new long[]{Long.MIN_VALUE,0l};
        //层序遍历
        levelOrder(root,numArray);
        return (int)numArray[1];
    }
    //层序优先遍历，通过for循环记录当前层数
    public void levelOrder(TreeNode root ,long [] numArray){
        Queue<TreeNode> queue = new LinkedList();
        //使用数字记录当前层的节点大小
        queue.offer(root);
        int level = 0;
        while(!queue.isEmpty()){
            //记录的一定是这一层节点的数量
            int size = queue.size();
            long sum = 0l;
            level++;
            //使用for循环来控制将该层节点全部出队
            for(int i =0;i<size;i++){
                TreeNode node = queue.poll();
                sum+=node.val;
                if(i == size - 1){
                    if(sum > numArray[0]){
                        numArray[0] = sum;
                        numArray[1] = level;
                    }
                }
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
        }
    }
}
